package com.yc.thread.lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 打断“等待锁”
 * 注意：是打断“等锁”，而不是已经获得锁的进程
 * @author Administrator
 *
 */
public class TestInterruptedLock {
	
	Lock lock = new ReentrantLock();
	
	/**
	 * 获取锁
	 * 		如果获取不到，等待10秒钟就中断
	 * 		如果获取到了，就sleep20秒
	 * 
	 */
	public void m1(){
//		lock.lock();
	}
	
	/**
	 * 拿锁100秒
	 * 一直sleep   ？：sleep是释放cup？和锁无关
	 */
	public void m2() {
		lock.lock();
		System.out.println("m2 start...");
		try {
			TimeUnit.SECONDS.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			System.out.println("m2 end!");
			lock.unlock();
		}
	}
	
	/**
	 * 尝试拿锁：100秒一直等
	 * 睡5秒，然后打断等待
	 */
	public void m3() {
		try {
			//这句话单独执行，还是放lock.lock();之后，不行，放之后就执行不到了，只能是有个监听器
			//监听这个线程是否还在等，时间长就把这个等待中断
//			TimeUnit.SECONDS.sleep(5);
			lock.lockInterruptibly();
		} catch (InterruptedException e) {
			System.out.println("----m3--interrupted");
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
//		System.out.println("m3 start...");
	}

	public static void main(String[] args) {
		TestInterruptedLock tt = new TestInterruptedLock();
		Thread T2 = new Thread(tt::m2);
		Thread T3 = new Thread(tt::m3);
		T2.start();
		T3.start();
		try {
			TimeUnit.SECONDS.sleep(3);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		T3.interrupt();//打断T3的等待

	}

}
